package com.example.testing.launchmode;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import com.example.testing.R;

/**
 * singleTask:栈内复用模式。这是一种单实例模式。在这种模式下，只要Activity在一个栈中存在，那么多次启动此Activity，
 * 都不会创建新的实例，和singleTop一样，系统会回调onNewIntent。具体一点，当一个具有singleTask模式当Activity请求启动后，
 * 比如Activity A, 系统首先会寻找是否存在A想要当任务栈，如果不存在，就重新创建一个任务栈，然后创建A实例后把A放到栈中。
 * 如果存在A所需要的任务栈，这时候要看A是否在栈中有实例存在，如果有实例存在，那么系统就会把A调到栈顶，这时候要看A是否在栈顶：
 * 如果在栈顶：onPause->onNewIntent->onResume
 * 如果不在栈顶：销毁中间activity（调用其onStop、onDestory方法）,并调用A的onNewIntent－>onRestart->onStart->onResume方法
 * 如果实例不存在，就会创建A的实例，并把A压入栈。举几个例子：
 *
 * 1.比如目前任务栈S1中的情况为ABC，这个时候Activity D以singleTask模式请求启动，其所需要的任务栈为S2,由于S2和D的实例均不存在，
 * 所以系统会先创建任务栈S2,然后再创建D的实例，并将其入栈到S2.
 *
 * 2.另一种情况，假设D所需要的任务栈为S1,其它情况如上面例子1所示，那么由于S1已经存在，所以系统会直接创建D的实例，并将其入栈S1
 *
 * 3.如果D所需要的任务栈为S1,并且当前任务栈S1的情况为ADBC，根据栈内复用的原则，此时D不会重新创建，系统会把D切换到栈顶并调用其onNewIntent
 * 方法，同时由于singleTask默认具有clearTop的效果，会导致栈内所有在D上面的Activity全部出栈。于是最终S1中的情况为AD。
 *
 * 补充：前文中提到的Activity所需要的任务栈，是通过清单文件里的actiivty标签下taskAffinity来指定的，默认为包名。
 */
public class SingleTaskActivity extends Activity {
    private static final String TAG = "SingleTaskActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.e(TAG, "onCreate: taskId:" + getTaskId() );
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_launchmode_singletask);
        findViewById(R.id.tv_launcher_mode).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(SingleTaskActivity.this, SingleTaskActivity.class);
                startActivity(intent);
            }
        });
    }

    @Override
    protected void onNewIntent(Intent intent) {
        Log.e(TAG, "onNewIntent: ");
        super.onNewIntent(intent);
    }

    @Override
    protected void onRestart() {
        Log.e(TAG, "onRestart: ");
        super.onRestart();
    }

    @Override
    protected void onStart() {
        Log.e(TAG, "onStart: ");
        super.onStart();
    }

    @Override
    protected void onResume() {
        Log.e(TAG, "onResume: ");
        super.onResume();
    }

    @Override
    protected void onPause() {
        Log.e(TAG, "onPause: ");
        super.onPause();
    }

    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        Log.e(TAG, "onRestoreInstanceState:");
        String name = (String) savedInstanceState.get("name");
        Toast.makeText(this, "name:" + name, Toast.LENGTH_SHORT).show();
        super.onRestoreInstanceState(savedInstanceState);
    }
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        Log.e(TAG, "onSaveInstanceState: ");
        super.onSaveInstanceState(outState);
        outState.putString("name", "josan");
    }

    @Override
    protected void onStop() {
        Log.e(TAG, "onStop: ");
        super.onStop();
    }

    @Override
    protected void onDestroy() {
        Log.e(TAG, "onDestroy: ");
        super.onDestroy();
    }
}
